package com.mazaiting.redeye.service;

import com.mazaiting.redeye.dao.UserDao;
import com.mazaiting.redeye.domain.*;
import com.mazaiting.redeye.config.TipConfig;
import com.mazaiting.redeye.utils.third.SmsUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

/***
 *
 *
 *                                                    __----~~~~~~~~~~~------___
 *                                   .  .   ~~//====......          __--~ ~~
 *                   -.            \_|//     |||\\  ~~~~~~::::... /~
 *                ___-==_       _-~o~  \/    |||  \\            _/~~-
 *        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
 *    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
 *  .~       .~       |   \\ -_    /  /-   /   ||      \   /
 * /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
 * |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
 *          '         ~-|      /|    |-~\~~       __--~~
 *                      |-~~-_/ |    |   ~\_   _-~            /\
 *                           /  \     \__   \/~                \__
 *                       _--~ _/ | .-~~____--~-/                  ~~==.
 *                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
 *                                 -_     ~\      ~~---l__i__i__i--~~_/
 *                                 _-~-__   ~)  \--______________--~~
 *                               //.-~~~-~_--~- |-------~~~~~~~~
 *                                      //.-~~~--\
 *                               神兽保佑
 *                              代码无BUG!
 * @author mazaiting
 * @date 2019-06-19
 * @decription 用户服务
 */
@Service
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
public class UserService {

    /**
     * 日志工具
     */
    private Logger mLog = LoggerFactory.getLogger(UserService.class);
    /**
     * 用户 DAO
     */
    private final UserDao mDao;

    @Autowired
    public UserService(UserDao dao) {
        this.mDao = dao;
    }

    /**
     * 登录
     *
     * @param user 用户信息
     * @return 0: 用户不存在/密码不正确
     * 1: 登录成功
     */
    public Response<Request<UserBean>> login(UserBean user) {
        // 根据用户名查询用户信息
        UserBean userBean = mDao.queryUserByName(user.getUsername());
        // 响应内容
        Response<Request<UserBean>> response = new Response<>();
        // 检测是否有该用户
        if (null != userBean) {
            mLog.debug("响应内容: " + userBean.toString());
            // 解密数据
            try {
                // 密码解密
                String password = user.decryptPwd(user.getPassword());
                // 检测密码是否相同
                if (password.equals(userBean.getPassword())) {
                    // 登录成功
                    response.setResponse(ResponseCode.SUCCESS, TipConfig.USER_LOGIN_SUCCESS);
                } else {
                    // 密码不正确
                    response.setResponse(ResponseCode.ERROR, TipConfig.USER_PWD_WRONG);
                }
            } catch (Exception e) {
                response.setResponse(ResponseCode.ERROR, TipConfig.USER_PWD_DECRYPT_FAILED + " - " + e.getMessage());
            }
        } else {
            // 用户不存在
            response.setResponse(ResponseCode.ERROR, TipConfig.USER_NO_EXIST);
        }
        return response;
    }

    /**
     * 注册
     *
     * @param user 用户信息
     * @return 响应信息
     */
    public Response<Object> register(UserBean user) {
        mLog.debug("注册内容: " + user.toString());
        // 检测用户名是否存在
        UserBean userBean = mDao.queryUserByName(user.getUsername());
        // 响应内容
        Response<Object> response = new Response<>();
        // 检测是否存在用户
        if (null == userBean) {
            // 检测用户信息
            if (user.checkRegisterUser(response)) {
                return response;
            }
            // 添加用户
            int row = mDao.addUser(user);
            mLog.debug("插入行: " + row);
            // 检测是否正确插入
            if (row > 0) {
                // 注册成功
                response.setResponse(ResponseCode.SUCCESS, TipConfig.USER_REGISTER_SUCCESS);
            } else {
                // 注册失败
                response.setResponse(ResponseCode.ERROR, TipConfig.USER_REGISTER_ERROR);
            }
        } else {
            // 用户存在
            response.setResponse(ResponseCode.ERROR, TipConfig.USER_EXIST);
        }
        return response;
    }

    /**
     * 获取用户信息
     *
     * @param userBeanRequest 用户信息
     * @return 用户信息
     */
    public Response<UserBean> information(Request<UserBean> userBeanRequest) {
        Response<UserBean> response = new Response<>();
        // 获取用户信息
        UserBean data = userBeanRequest.getData();
        // 检测用户信息是否为空
        if (StringUtils.isEmpty(data) || StringUtils.isEmpty(data.getUsername())) {
            response.setResponse(0, TipConfig.USER_NAME_NOT_NULL);
        } else {
            // 根据用户名查询信息
            UserBean userBean = mDao.queryUserInfoByName(data.getUsername());
            // 检测对象为空
            if (StringUtils.isEmpty(userBean)) {
                response.setResponse(0, "查询失败, " + TipConfig.USER_NAME_NOT_NULL, null);
            } else {
                // 设置 ID 与 密码为空
                userBean.setId(0);
                userBean.setPassword("");
                response.setResponse(1, "查询成功", userBean);
            }
        }
        return response;
    }

    /**
     * 更新用户信息
     *
     * @param user 用户信息
     * @return 是否成功
     */
    public Response updateUser(UserBean user) {
        Response response = new Response();
        // 检测用户名是否为空
        if (StringUtils.isEmpty(user) || StringUtils.isEmpty(user.getUsername())) {
            response.setResponse(ResponseCode.ERROR, TipConfig.USER_NAME_NOT_NULL);
        } else {
            // 更新用户信息
            int number = mDao.updateUser(user);
            mLog.debug("更新行数: " + number);
            // 检测是否成功
            if (number > 0) {
                response.setResponse(ResponseCode.SUCCESS, "更新用户信息成功");
            } else {
                response.setResponse(ResponseCode.ERROR, "更新用户信息失败");
            }
        }
        return response;
    }

    /**
     * 更新用户手机号
     *
     * @param verifyCodeBean 验证码 Bean
     * @return 是否成功
     */
    public Response updatePhoneNumber(VerifyCodeBean<UserBean> verifyCodeBean) {
        Response response = new Response();
        // 用户手机号
        UserBean userBean = verifyCodeBean.getData();
        // 检测用户 Bean, 用户名, 手机号是否为空
        if (StringUtils.isEmpty(userBean) || StringUtils.isEmpty(userBean.getUsername())) {
            return response.setResponse(ResponseCode.ERROR, "用户名不能为空");
        }
        // 检测手机号
        String phoneNumber = userBean.getPhone();
        if (StringUtils.isEmpty(phoneNumber)) {
            return response.setResponse(ResponseCode.ERROR, "手机号不能为空");
        }
        // 用户验证码
        String verifyCode = verifyCodeBean.getVerifyCode();
        // 检测验证码
        if (StringUtils.isEmpty(verifyCode)) {
            return response.setResponse(ResponseCode.ERROR, "验证码不能为空");
        }

        // 检测验证码长度
        if (verifyCode.length() != 6) {
            return response.setResponse(ResponseCode.ERROR, "验证码长度必须为 6 位");
        }
        // 验证验证码是否匹配
        VerifyCodeBean.ResultBean resultBean = SmsUtil.verify(phoneNumber, verifyCode);
        // 如果状态为 200, 则为成功
        if (resultBean.getStatus() != 200) {
            return response.setResponse(ResponseCode.ERROR, resultBean.getError());
        }
        // 更新用户手机号
        int num = mDao.updateUser(userBean);
        // 更新行数大于 0, 则说明更新成功
        if (num > 0) {
            return response.setResponse(ResponseCode.SUCCESS, "更新手机号成功");
        } else {
            return response.setResponse(ResponseCode.ERROR, "更新失败");
        }
    }
}
